/**
 * ======================================================================
 * 【基本说明】：
 * 本文件是生成Protocal对象的工厂方法集合，对应于MobileIMSDK-APP版中的ProtocalFactory类。
 *
 * Created by Jack Jiang on 16-8-31.
 * ======================================================================
 */


var uuid = require('node-uuid');
var ProtocalType = require('./protocal-type');
var ProtocalClass = require('./protocal');

/**
 * 私有方法：构建一个Protocal对象。
 *
 * @param type MobileIMSDK协议的系统级事件/协议类型，本字段通常仅用于MobileIMSDK-Web版框架内部使用
 * @param dataContent 要发送的数据内容
 * @param from_user_id 发送人的user_id
 * @param to_user_id 接收人的user_id
 * @param fingerPrint 消息包的指纹码（即唯一ID）
 * @param typeu 应用层专用字段——用于应用层存放聊天、推送等场景下的消息类型。注意：此值为-1时表示未定义。
 *              MobileIMSDK_X框架中，本字段为保留字段，不参与框架的核心算法，专留用应用层自行定义和使用。
 * @returns {Protocal|exports|module.exports}
 * @private
 */
function _createProtocal(type, dataContent, from_user_id, to_user_id, fingerPrint, typeu){
    var p = new ProtocalClass();
    p.from = from_user_id;
    p.to = to_user_id;
    p.dataContent = dataContent;
    p.fp = fingerPrint;
    p.type = type;
    p.typeu = typeu;
    return p;
}

/**
 * 私有方法：构建一个通用数据Protocal对象。
 *
 * @param dataContent 要发送的消息内容
 * @param from_user_id 发送人的user_id
 * @param to_user_id 接收人的user_id
 * @param typeu 应用层专用字段——用于应用层存放聊天、推送等场景下的消息类型。注意：此值为-1时表示未定义。
 *              MobileIMSDK_X框架中，本字段为保留字段，不参与框架的核心算法，专留用应用层自行定义和使用。
 * @private 新建的Protocal对象
 */
function _createCommonData(dataContent, from_user_id, to_user_id, typeu){
    return _createProtocal(ProtocalType.C_IMEVT_COMMON$DATA, dataContent
        , from_user_id, to_user_id
        , uuid.v1()// 20160921后启动uuid生成， uuid对象由uuid.js文件中代码定义
        , typeu
    );
}


/**
 * 公开方法：通用消息的Protocal对象新建方法（默认typeu=-1）。
 * <b>本方法主要由MobileIMSDK框架内部使用。</b>
 *
 * @param dataContent 要发送的消息内容
 * @param from_user_id 发送人的user_id
 * @param to_user_id 接收人的user_id
 * @return 新建的Protocal对象
 */
exports.createCommonData = function (dataContent, from_user_id, to_user_id) {
    return _createCommonData(dataContent, from_user_id, to_user_id, -1);
};

/**
 * 公开方法：通用消息的Protocal对象新建方法。
 * <b>本方法供应用层使用。</b>
 *
 * @param dataContent 要发送的消息内容
 * @param from_user_id 发送人的user_id
 * @param to_user_id 接收人的user_id
 * @param typeu 应用层专用字段——用于应用层存放聊天、推送等场景下的消息类型。注意：此值为-1时表示未定义。
 *              MobileIMSDK_X框架中，本字段为保留字段，不参与框架的核心算法，专留用应用层自行定义和使用。
 * @return 新建的Protocal对象
 */
exports.createCommonDataU = function (dataContent, from_user_id, to_user_id, typeu) {
    return _createCommonData(dataContent, from_user_id, to_user_id, typeu);
};

/**
 * 公开方法：服务端返回给客户的重复登陆（被踢/被挤下线）消息。
 *
 * @param to_user_id 指令/协议/消息 接收者的user_id
 * @return 新建的Protocal对象
 */
exports.createDuplicatedLoginResponse = function (to_user_id){
    return _createProtocal(ProtocalType.S_IMEVT_DUPLICATED
                , 'Duplicat login!' // 此字段暂无意义，随便放什么
                , '0' // 此消息由服务发出，所以from是'0'
                , to_user_id
                , null);
};

/**
 * 公开方法：服务端返回给客户的非法连接（被拒绝服务）消息。
 *
 * @param to_user_id 指令/协议/消息 接收者的user_id
 * @return 新建的Protocal对象
 */
exports.createIllegalResponse = function (to_user_id){
    return _createProtocal(ProtocalType.S_IMEVT_ILLEGAL
        , 'Illegal socket connection!' // 此字段暂无意义，随便放什么
        , '0' // 此消息由服务发出，所以from是'0'
        , to_user_id
        , null);
};
